from typing import List


class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        st = []  # 单调栈，存储的是索引，栈中对应的height是单调递减的
        for i, h in enumerate(height):
            while st and h >= height[st[-1]]:  # 当前高度大于等于栈顶高度
                bottom_h = height[st.pop()]  # 弹出栈顶，作为凹槽的底部
                if not st:  # 如果栈为空，说明没有左边界，无法接水
                    break
                left = st[-1]  # 新的栈顶是左边界
                dh = min(height[left], h) - bottom_h  # 水的高度是左右边界的最小值减去底部高度
                ans += dh * (i - left - 1)  # 水的宽度是左右边界的距离
            st.append(i)  # 将当前索引入栈
        return ans